<?php

declare(strict_types=1);

namespace App\Core;

use App\Services\ThemeManager;

final class View
{
    public static function render(string $template, array $data = []): string
    {
        $root = defined('APP_ROOT') ? APP_ROOT : dirname(__DIR__, 2);

        // 定义模板目录常量（如果尚未定义）
        if (!defined('TEMPLATES_DIR')) {
            define('TEMPLATES_DIR', $root . '/templates');
        }

        // 检查是否是管理后台模板
        $isAdmin = strpos($template, 'admin/') === 0;

        if (!$isAdmin) {
            // 前台使用主题系统
            try {
                $themeManager = ThemeManager::getInstance();

                // 检查是否有预览主题
                $previewTheme = $_SESSION['preview_theme'] ?? null;
                if ($previewTheme) {
                    // 临时设置预览主题
                    $originalTheme = $themeManager->getCurrentTheme();
                    $themeManager->setCurrentTheme($previewTheme);
                }

                $themeTemplate = $themeManager->getThemePath($template);
                $templateFile = TEMPLATES_DIR . '/' . $themeTemplate;

                // 如果使用了预览主题，恢复原始主题
                if ($previewTheme) {
                    $themeManager->setCurrentTheme($originalTheme);
                }
            } catch (\Exception $e) {
                // 如果主题管理器出错，回退到默认模板
                $templateFile = TEMPLATES_DIR . '/' . $template . '.php';
            }
        } else {
            // 后台使用固定模板
            $templateFile = TEMPLATES_DIR . '/' . $template . '.php';
        }

        if (!file_exists($templateFile)) {
            throw new \RuntimeException("Template not found: $templateFile");
        }

        // 提取变量到当前作用域
        extract($data, EXTR_SKIP);

        // 添加当前主题信息到模板变量
        if (!$isAdmin) {
            try {
                $themeManager = ThemeManager::getInstance();

                // 检查是否有预览主题
                $previewTheme = $_SESSION['preview_theme'] ?? null;
                if ($previewTheme) {
                    $currentTheme = $previewTheme;
                    $themeConfig = $themeManager->getThemeConfig($previewTheme);

                    // 添加预览标记
                    $isPreview = true;
                } else {
                    $currentTheme = $themeManager->getCurrentTheme();
                    $themeConfig = $themeManager->getThemeConfig();
                    $isPreview = false;
                }
            } catch (\Exception $e) {
                $currentTheme = 'default';
                $themeConfig = [];
                $isPreview = false;
            }
        }

        // 开始输出缓冲
        ob_start();
        include $templateFile;
        $content = ob_get_clean();

        // 如果模板没有使用布局，直接返回内容
        if (!isset($layout)) {
            return $content;
        }

        // 使用布局渲染
        return self::renderWithLayout($layout, $content, $data, $isAdmin);
    }

    private static function renderWithLayout(string $layout, string $content, array $data = [], bool $isAdmin = false): string
    {
        $root = defined('APP_ROOT') ? APP_ROOT : dirname(__DIR__, 2);

        if (!$isAdmin && $layout !== 'admin') {
            // 前台使用主题布局
            try {
                $themeManager = ThemeManager::getInstance();

                // 检查是否有预览主题
                $previewTheme = $_SESSION['preview_theme'] ?? null;
                if ($previewTheme) {
                    // 临时设置预览主题
                    $originalTheme = $themeManager->getCurrentTheme();
                    $themeManager->setCurrentTheme($previewTheme);
                    $currentTheme = $previewTheme;
                } else {
                    $currentTheme = $themeManager->getCurrentTheme();
                }

                // 先检查主题是否有自定义布局
                $themeLayoutFile = $root . '/templates/themes/' . $currentTheme . '/layouts/' . $layout . '.php';

                if (file_exists($themeLayoutFile)) {
                    $layoutFile = $themeLayoutFile;
                } else {
                    // 回退到默认布局
                    $layoutFile = $root . '/templates/layouts/' . $layout . '.php';
                }

                // 如果使用了预览主题，恢复原始主题
                if ($previewTheme) {
                    $themeManager->setCurrentTheme($originalTheme);
                }
            } catch (\Exception $e) {
                // 如果主题管理器出错，回退到默认布局
                $layoutFile = $root . '/templates/layouts/' . $layout . '.php';
            }
        } else {
            // 后台使用固定布局
            $layoutFile = $root . '/templates/layouts/' . $layout . '.php';
        }

        if (!file_exists($layoutFile)) {
            throw new \RuntimeException("Layout not found: $layoutFile");
        }

        // 提取变量到当前作用域
        extract($data, EXTR_SKIP);

        // 开始输出缓冲
        ob_start();
        include $layoutFile;
        return ob_get_clean();
    }
}
